package beans;

import entidades.Usuario;
import java.io.NotSerializableException;
import java.io.Serializable;
import java.math.BigInteger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.primefaces.model.chart.PieChartModel;
import rn.AnexoProcessoRN;
import rn.ProcessoRN;
import rn.UsuarioRN;
import rn.VolumeProcessoRN;
import util.ContextoUtil;

/**
 *
 * @author Marcelo Neto
 */
@ManagedBean(name="graficoBean")
@RequestScoped
public class GraficoBean implements Serializable 
{
    private static final long serialVersionUID = 8464531179589721803L;
    
    private PieChartModel pieModelUsuarios = null;
    private PieChartModel pieModelTotalProcessosNoSetor = null;
    private PieChartModel pieModelTotalAnexos = null;
    private BigInteger totalDeUsuarios;
    private BigInteger totalDeVolumesNoSetor;
    private BigInteger totalDeAnexosNoSetor;
    private PieChartModel pieModelTotalProcessosAtivos = null;
    private BigInteger totalDeVolumesAtivos;
    private BigInteger totalDeAnexosAtivos;
    private BigInteger totalDeProcessosAtivos;
    //private BigInteger totalDeSolicitacoesGerais;
    //private BigInteger totalDeSolicitacoesEfetuadas;
    //private PieChartModel pieModelAdmin, pieModelUsu;
    //private CartesianChartModel cartesianChartModel = new CartesianChartModel();
    
    public GraficoBean(){}
    
    public void executar() throws NotSerializableException
    {/*
        this.setDataIni(this.dataIni);
        this.setDataFim(this.dataFim);
        this.cartesianChartModel = new CartesianChartModel();
        SolicitacaoRN solicitacaoRN = new SolicitacaoRN();
        Object obj1;
        Integer autorizada;
        Object obj2;
        Integer nautorizada;
        Object obj4;
        Integer cancelada;
        Object obj3;
        Integer emAnalise;
        Object obj5;
        Integer arquivada;
        try 
        {
            if (dataIni.after(dataFim)) {
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "A data inicial deve ser menor que a data final!", ""));
            }
            else
            {
                obj1 = (Object) solicitacaoRN.totalSolicitacoesPorPeriodo(2, this.dataIni, this.dataFim);
                autorizada = (Integer)obj1;
                obj2 = (Object) solicitacaoRN.totalSolicitacoesPorPeriodo(3, this.dataIni, this.dataFim);
                nautorizada = (Integer)obj2;
                obj3 = (Object) solicitacaoRN.totalSolicitacoesPorPeriodo(1, this.dataIni, this.dataFim);
                emAnalise = (Integer)obj3;
                obj4 = (Object) solicitacaoRN.totalSolicitacoesPorPeriodo(4, this.dataIni, this.dataFim);
                cancelada = (Integer)obj4;
                obj5 = (Object) solicitacaoRN.totalSolicitacoesPorPeriodo(5, this.dataIni, this.dataFim);
                arquivada = (Integer)obj5;
                
                if ((obj1 == null || autorizada <= 0) && (obj2 == null || nautorizada <= 0) && (obj3 == null || emAnalise <= 0) && (obj4 == null || cancelada <= 0) && (obj5 == null || arquivada <= 0)) {
                    FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Nenhuma solicitação foi encontrada para o período informado!", ""));
                }
                else {
                    ChartSeries totais = new ChartSeries();  
                    totais.setLabel(""); 
                    totais.set("Em Análise", emAnalise);
                    totais.set("Autorizada", autorizada);
                    totais.set("Não-autorizada", nautorizada);
                    totais.set("Cancelada", cancelada);
                    totais.set("Arquivada", arquivada);
                    this.cartesianChartModel.addSeries(totais);
                    this.setCartesianChartModel(this.cartesianChartModel);
                }
            }
        }
        catch(Exception ex) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Um erro inesperado ocorreu! Não foi possível gerar o gráfico", ex.getMessage()));
        }
        
        this.setCartesianChartModel(cartesianChartModel);
        */
    }
    
    public void setPieModelUsuarios(PieChartModel pieModelUsuarios) {
        this.pieModelUsuarios = pieModelUsuarios;
    }
    
    public PieChartModel getPieModelUsuarios() 
    {
        this.pieModelUsuarios = new PieChartModel();
        try 
        {
            ContextoBean contextoBean = ContextoUtil.getContextoBean();
            Usuario usuario = contextoBean.getUsuarioLogado();
            UsuarioRN usuarioRN = new UsuarioRN();
            if (this.pieModelUsuarios != null)
            {
                if (usuario == null) {
                    return this.pieModelUsuarios;
                }
                else 
                {
                    Object obj1 = (Object) usuarioRN.totalUsuariosAtivos();
                    Object obj2 = (Object) usuarioRN.totalUsuariosInativos();
                    BigInteger totalUsuariosAtivos = (BigInteger)obj1; 
                    BigInteger totalUsuariosInativos = (BigInteger)obj2;
                    
                    
                    this.pieModelUsuarios.set("Usuários ativos", totalUsuariosAtivos);
                    this.pieModelUsuarios.set("Usuários inativos", totalUsuariosInativos);
                    //this.pieModel.set("Usuários inativos", new Integer(totalUsuariosInativos));
                    return this.pieModelUsuarios;
                }
            }
        }
        catch(Exception ex) {
            System.out.println("Erro ao tentar montar o gráfico de pizza\n"+ ex.getMessage());
        }
        return pieModelUsuarios;
    }

    // No postgresql pede BigInteger. 
    public BigInteger getTotalDeUsuarios() 
    {
        UsuarioRN usuarioRN = new UsuarioRN();
        Object obj = (Object) usuarioRN.totalUsuarios();
        totalDeUsuarios = (BigInteger)obj; 
        return totalDeUsuarios;
    }

    public void setTotalDeUsuarios(BigInteger totalDeUsuarios) {
        this.totalDeUsuarios = totalDeUsuarios;
    }

    public BigInteger getTotalDeVolumesNoSetor() {
        return totalDeVolumesNoSetor;
    }

    public void setTotalDeVolumesNoSetor(BigInteger totalDeVolumesNoSetor) {
        this.totalDeVolumesNoSetor = totalDeVolumesNoSetor;
    }

    public PieChartModel getPieModelTotalProcessosNoSetor() 
    {
        try 
        {
            this.pieModelTotalProcessosNoSetor = new PieChartModel();
            ContextoBean contextoBean = ContextoUtil.getContextoBean();
            Usuario usuario = contextoBean.getUsuarioLogado();
            Integer unidadeUsu = usuario.getPessoa().getUnidade();
            Integer setorUsu = usuario.getPessoa().getSetor();
            
            VolumeProcessoRN volumeProcessoRN = new VolumeProcessoRN();
            AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
            
            if (this.pieModelTotalProcessosNoSetor != null)
            {
                Object obj1 = (Object) volumeProcessoRN.totalVolumesNoSetor(unidadeUsu, setorUsu);
                Object obj2 = (Object) anexoProcessoRN.totalAnexosNoSetor(unidadeUsu, setorUsu);
                BigInteger totalVolumes = (BigInteger)obj1; 
                BigInteger totalAnexos = (BigInteger)obj2;
                     
                this.pieModelTotalProcessosNoSetor.set("Volumes", totalVolumes);
                this.pieModelTotalProcessosNoSetor.set("Anexos", totalAnexos);
                //this.pieModel.set("Usuários inativos", new Integer(totalUsuariosInativos));
                return this.pieModelTotalProcessosNoSetor;
            }
        }
        catch(Exception ex) {
            System.out.println("Erro ao tentar montar o gráfico de pizza\n"+ ex.getMessage());
        }
        return pieModelTotalProcessosNoSetor;
    }

    public void setPieModelTotalProcessosNoSetor(PieChartModel pieModelTotalProcessosNoSetor) {
        this.pieModelTotalProcessosNoSetor = pieModelTotalProcessosNoSetor;
    }

    public BigInteger getTotalDeAnexosNoSetor() {
        return totalDeAnexosNoSetor;
    }

    public void setTotalDeAnexosNoSetor(BigInteger totalDeAnexosNoSetor) {
        this.totalDeAnexosNoSetor = totalDeAnexosNoSetor;
    }

    public PieChartModel getPieModelTotalAnexos() {
        return pieModelTotalAnexos;
    }

    public void setPieModelTotalAnexos(PieChartModel pieModelTotalAnexos) {
        this.pieModelTotalAnexos = pieModelTotalAnexos;
    }

    public PieChartModel getPieModelTotalProcessosAtivos() 
    {
        try 
        {
            this.pieModelTotalProcessosAtivos = new PieChartModel();
            ProcessoRN processoRN = new ProcessoRN();
            VolumeProcessoRN volumeProcessoRN = new VolumeProcessoRN();
            AnexoProcessoRN anexoProcessoRN = new AnexoProcessoRN();
            
            if (this.pieModelTotalProcessosAtivos != null)
            {
                Object obj1 = (Object) processoRN.totalProcessoPorStatus(1);
                Object obj2 = (Object) volumeProcessoRN.totalVolumesPorStatus(1);
                Object obj3 = (Object) anexoProcessoRN.totalAnexosPorStatus(1);
                BigInteger totalProcessos = (BigInteger)obj1; 
                BigInteger totalVolumes = (BigInteger)obj2;
                BigInteger totalAnexos = (BigInteger)obj3;
                     
                this.pieModelTotalProcessosAtivos.set("Processos", totalProcessos);
                this.pieModelTotalProcessosAtivos.set("Volumes", totalVolumes);
                this.pieModelTotalProcessosAtivos.set("Anexos", totalAnexos);
                //this.pieModel.set("Usuários inativos", new Integer(totalUsuariosInativos));
                return this.pieModelTotalProcessosAtivos;
            }
        }
        catch(Exception ex) {
            System.out.println("Erro ao tentar montar o gráfico de pizza\n"+ ex.getMessage());
        }
        return pieModelTotalProcessosAtivos;
    }

    public void setPieModelTotalProcessosAtivos(PieChartModel pieModelTotalProcessosAtivos) {
        this.pieModelTotalProcessosAtivos = pieModelTotalProcessosAtivos;
    }

    public BigInteger getTotalDeVolumesAtivos() {
        return totalDeVolumesAtivos;
    }

    public void setTotalDeVolumesAtivos(BigInteger totalDeVolumesAtivos) {
        this.totalDeVolumesAtivos = totalDeVolumesAtivos;
    }

    public BigInteger getTotalDeAnexosAtivos() {
        return totalDeAnexosAtivos;
    }

    public void setTotalDeAnexosAtivos(BigInteger totalDeAnexosAtivos) {
        this.totalDeAnexosAtivos = totalDeAnexosAtivos;
    }

    public BigInteger getTotalDeProcessosAtivos() {
        return totalDeProcessosAtivos;
    }

    public void setTotalDeProcessosAtivos(BigInteger totalDeProcessosAtivos) {
        this.totalDeProcessosAtivos = totalDeProcessosAtivos;
    }
}